package asphalt2.processor
{
	import flash.events.Event;
	import asphalt2.control.IControl;
	import asphalt2.control.AbstractControl;
	import flash.display.DisplayObjectContainer;
	import asphalt2.container.PageContainer;
	import asphalt2.event.PageContainerEvent;
	import mx.core.ClassFactory;
	import flash.utils.describeType;
	/**
	 * 画面遷移を伴うプロセッサー
	 * @author c9katayama
	 **/
	public class BasePageTransitionProcessor extends BaseProcessor implements IPageTransitionProcessor
	{
		private var _nextPageClass:Class;
		
		private var _pageContainerId:String;
		
		private var _nextPageProperties:Object;
		/**
		 * @param control コントロールクラス
		 * @param nextPageClass 次に表示するページのクラス
		 * @param pageContainerId 表示対象のPageContainerのid nullの場合、自分の親に対して画面入れ替えをします。
		 * @param nextPageProperties 次に表示するページに対してセットするプロパティ　このプロパティを使って、画面間のデータを受け渡しできます。
		 */
		public function BasePageTransitionProcessor(control:AbstractControl, 
													nextPageClass:Class, 
													pageContainerId:String=null,
													nextPageProperties:Object=null)		
		{
			super(control);
			this._nextPageClass = nextPageClass;
			this._pageContainerId = pageContainerId;
			this._nextPageProperties = nextPageProperties;
		}

		override public function doProcess(event:Event):void{
			doFinalize();
		}
		public function doFinalize():void
		{
			invokeControl("finalize",this,"moveToNextPage");
		}
		public function moveToNextPage():void{
			var targetId:String = pageContainerId;
			if(targetId == null){
				var parent:DisplayObjectContainer = control.UI.parent;
				while(true){
					if(parent == null)
						return ;
					if(parent is PageContainer){
						targetId = PageContainer(parent).id;
						break;
					}
				}
			}
			var e:PageContainerEvent = new PageContainerEvent(targetId,nextPageClass,nextPageProperties);
			control.UI.dispatchEvent(e);
		}

		public function get pageContainerId():String
		{
			return _pageContainerId;
		}		
		public function get nextPageClass():Class
		{
			return _nextPageClass;
		}
		public function get nextPageProperties():Object{
			return _nextPageProperties;
		}
	}
}